/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package desarrollosoft.ghce.vista.implementaciones;

import desarrollosoft.ghce.entidades.Profesional;
import desarrollosoft.ghce.servicio.interfaces.IServicioProfesionales;
import desarrollosoft.ghce.soporte.Global;
import desarrollosoft.ghce.soporte.SecurityUtil;
import desarrollosoft.ghce.vista.interfaces.Cambiable;
import java.util.HashMap;
import java.util.Map;
import org.zkoss.zk.ui.Component;
import org.zkoss.zk.ui.Executions;
import org.zkoss.zk.ui.select.SelectorComposer;
import org.zkoss.zk.ui.select.annotation.Listen;
import org.zkoss.zk.ui.select.annotation.VariableResolver;
import org.zkoss.zk.ui.select.annotation.Wire;
import org.zkoss.zk.ui.select.annotation.WireVariable;
import org.zkoss.zul.Label;
import org.zkoss.zul.Messagebox;
import org.zkoss.zul.Window;

/**
 *
 * @author ariel
 */
@VariableResolver(org.zkoss.zkplus.spring.DelegatingVariableResolver.class)
public class ControladoraPantallaPrincipal extends SelectorComposer<Window> implements Cambiable {
    
    @WireVariable("servicioProfesionales")
    private IServicioProfesionales servicioProfesionales;
    
    @Wire
    private Window ventanaPrincipal;
    
    private Component referencia;
    
    @Wire("#ventanaArriba #labelIniciadaSesion")
    private Label labelIniciadaSesion;
    
    @Override
    public void doAfterCompose(Window comp) throws Exception {
        super.doAfterCompose(comp);
        hacerDespuesDeDibujar();
    }

    private void hacerDespuesDeDibujar() {
        String nombreUsuarioActual = SecurityUtil.getUserName();
        Profesional profesional;
        try {
            profesional = servicioProfesionales.buscarPorNombreUsuario(nombreUsuarioActual);
        } catch (Exception e) {
            Messagebox.show("Error inesperado al buscar usuario actual");
            return;
        }
        String apellidos = profesional.getApellido();
        String nombres = profesional.getNombre();
        String rol;
        Integer rolInteger = profesional.getRol();
        switch (rolInteger) {
            case Global.ROLE_USUARIO_PROFESIONAL:
                rol = "Profesional";
                break;
            case Global.ROLE_USUARIO_ADMINISTRADOR:
                rol = "Administrador";
                break;
            default:
                rol = "-";
                break;
        }
        labelIniciadaSesion.setValue("Ha iniciado sesión: " + apellidos + ", " + nombres + " (" + rol + ")");
    }
    
    @Listen("onClick = #menuitemAdministrar")
    public void clickAdministrarPacientes() {
        cambiar("AdministracionPacientes.zul");
    }
    
    @Listen("onClick = #menuItemRankingDiagnosticos")
    public void clickRankingDiagnosticos() {
        cambiar("RankingDiagnosticosComunes.zul");
    }
    
    @Listen("onClick = #menuItemRankingMedicamentos")
    public void clickRankingMedicamentos() {
        cambiar("RankingMedicamentosComunes.zul");
    }
    
    @Listen("onClick = #menuItemGraficoRelacionDiagnosticoPacientes")
    public void clickGraficoRelacionDiagnosticoPacientes() {
        cambiar("GraficoRelacionDiagnosticosPacientes.zul");
    }
    
    @Listen("onClick = #menuItemIndiceMortalidad")
    public void clickGraficoIndiceMortalidad() {
        cambiar("IndiceMortalidad.zul");
    }
        
    @Override
    public void cambiar(String nuevoZul) {
        Map<String,Object> mapaArgumentos = new HashMap(); // creo mapa con este controlador como argumento
        mapaArgumentos.put("controladoraPrincipal", this);
        if (referencia != null) {
            ventanaPrincipal.removeChild(referencia); // saco la referencia anterior (borro contenido anterior)
        }
        referencia = Executions.createComponents(nuevoZul, null, mapaArgumentos);
        ventanaPrincipal.appendChild((Window) referencia); // agrego la nueva ventana
    }
    
    @Override
    public void cambiarConArgumentos(String nuevoZul, Map<String, Object> argumentos) {
        argumentos.put("controladoraPrincipal", this);
        if (referencia != null) {
            ventanaPrincipal.removeChild(referencia); // saco la referencia anterior (borro contenido anterior)
        }
        referencia = Executions.createComponents(nuevoZul, null, argumentos);
        ventanaPrincipal.appendChild((Window) referencia); // agrego la nueva ventana
    }
    
}
